/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Service;

import DB.HibernateUtil;
import DB.Paciente;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author Hernán Garrido
 */
@WebService(serviceName = "PacienteWS")
public class PacienteWS {

    @WebMethod(operationName = "agregarPaciente")
    public boolean agregarPaciente(@WebParam(name = "apellidoPaterno") String apellidoPaterno,
                              @WebParam(name = "apellidoMaterno") String apellidoMaterno,
                              @WebParam(name = "bloque") String bloque, 
                              @WebParam(name = "calle") String calle,
                              @WebParam(name = "celular") String celular,
                              @WebParam(name = "comuna") String comuna,
                              @WebParam(name = "departamento") String departamento,
                              @WebParam(name = "email") String email,
                              @WebParam(name = "estadoCivil") String estadoCivil,
                              @WebParam(name = "fechaNac") String fechaNac,
                              @WebParam(name = "nombres") String nombres,
                              @WebParam(name = "numero") String numero,
                              @WebParam(name = "prevision") String prevision,
                              @WebParam(name = "profesion") String profesion,
                              @WebParam(name = "provincia") String provincia,
                              @WebParam(name = "region") String region,
                              @WebParam(name = "rut") String rut,
                              @WebParam(name = "sector") String sector,
                              @WebParam(name = "telefono") String telefono,
                              @WebParam(name = "sexo") String sexo,
                              @WebParam(name = "derivado") String derivado,
                              @WebParam(name = "visible") boolean visible
                              ){
        
        Paciente paciente = new Paciente(); 
        paciente.setApellidoPaterno(apellidoPaterno);
        paciente.setApellidoMaterno(apellidoMaterno);
        paciente.setBloque(bloque);
        paciente.setCalle(calle);
        paciente.setCelular(celular);
        paciente.setComuna(comuna);
        paciente.setDepartamento(departamento);
        paciente.setEstadoCivil(estadoCivil);
        paciente.setFechaNac(fechaNac);
        paciente.setEmail(email);
        paciente.setNombres(nombres);
        paciente.setNumero(numero);
        paciente.setPrevision(prevision);
        paciente.setProfesion(profesion);
        paciente.setProvincia(provincia);
        paciente.setRegion(region);
        paciente.setRut(rut);
        paciente.setSector(sector);
        paciente.setTelefono(telefono);
        paciente.setSexo(sexo);
        paciente.setDerivado(derivado);
        paciente.setVisible(visible);
       
        return ControladorDeObjetos.saveObject(paciente);
    }

    @WebMethod(operationName = "listarPacientes")
    public List<Paciente> listarPacientes() {
        //TODO write your implementation code here:
        return ControladorDeObjetos.getAllObjectByClassType(Paciente.class);
    }    

    @WebMethod(operationName = "cargarPaciente")
    public Object cargarPaciente(@WebParam(name = "rut") String rut) {
        return ControladorDeObjetos.loadObjectByStringId(rut, Paciente.class);
    }

    @WebMethod(operationName = "modificarPaciente")
    public boolean modificarPaciente(Paciente p){
        return ControladorDeObjetos.updateObject(p);
    }
    
    @WebMethod(operationName = "eliminarPaciente")
    public boolean eliminarPaciente(@WebParam(name = "rut") String rut ){
        Paciente p = (Paciente) ControladorDeObjetos.loadObjectByStringId(rut, Paciente.class);
        p.setVisible(false);
        return ControladorDeObjetos.updateObject(p);
    }
    
    @WebMethod(operationName = "restaurarPaciente")
    public boolean restaurarPaciente(@WebParam(name = "rut") String rut ){
        Paciente p = (Paciente) ControladorDeObjetos.loadObjectByStringId(rut, Paciente.class);
        p.setVisible(true);
        return ControladorDeObjetos.updateObject(p);
    }
    
    @WebMethod(operationName = "filtrarPaciente")
    public List<Paciente> filtrarPaciente(@WebParam(name = "buscar") String buscar) {
        
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction trans = s.beginTransaction();
        Criteria c = s.createCriteria(Paciente.class).add(
            Restrictions.or(
                Restrictions.or(
                    Restrictions.or(
                        Restrictions.ilike("rut", "%" + buscar + "%"), 
                        Restrictions.ilike("nombres", "%" + buscar + "%")
                    ),
                    Restrictions.or(
                        Restrictions.ilike("apellidoPaterno", "%" + buscar + "%"), 
                        Restrictions.ilike("apellidoMaterno", "%" + buscar + "%")
                    )
                ),
                Restrictions.or(
                    Restrictions.or(
                        Restrictions.ilike("prevision", "%" + buscar + "%"), 
                        Restrictions.ilike("fechaNac", "%" + buscar + "%")
                    ),
                    Restrictions.or(
                        Restrictions.ilike("telefono", "%" + buscar + "%"),
                        Restrictions.ilike("celular", "%" + buscar + "%")
                    )
                )
            )
        );

        List l = c.list();
        s.close();
        return l;
    }
}
